package ar.pmt.vista.manager.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Comparator;
import java.util.GregorianCalendar;
import java.util.SortedMap;
import java.util.TreeMap;

import org.apache.commons.collections.SortedBag;
import org.apache.commons.collections.bag.TreeBag;

import ar.pmt.vista.beans.AvanceBean;
import ar.pmt.vista.beans.ControlAvanceInicialTotalBean;
import ar.pmt.vista.beans.EstimacionBean;
import ar.pmt.vista.beans.IndiceBean;
import ar.pmt.vista.beans.RecursoBean;
import ar.pmt.vista.beansComplejos.EVABean;
import ar.pmt.vista.beansComplejos.PeticionBeanOriginal;
import ar.pmt.vista.utils.Utils;
/**
 * Singleton
 * @author gburgener
 *
 */
public class ControlAvanceManager {

   /*
    * Retorna los avances por peticion y/o recurso
    *
    * Si la tabla a de avances muestra otra cosa, por favor corregir el metdo @param peticion @param recurso @return
    */
   public Collection<AvanceBean> getAvances(PeticionBeanOriginal peticion, RecursoBean recurso, Collection totales) {
      // TODO Escribir el codigo real
      return createAvancesTruchos(totales);
   }

   /** Returns a sorted bag fy date of EVA for the petition indicated */

   public SortedBag getEVAs(PeticionBeanOriginal peticion) {
      // TODO Escribir el codigo real
      return crearEVAsTruchos();
   }

   public Collection<EstimacionBean> getEstimaciones(PeticionBeanOriginal peticion) {
      // TODO Escribir el codigo real
      return getEstimacionesTruchas();
   }

   public Collection<IndiceBean> getIndices(PeticionBeanOriginal peticion) {
      // TODO Escribir el codigo real
      return getIndicesTruchos();
   }


   // **********************************************************************************
   /*
    * Generacion de datos truchos
    */

   private Collection<AvanceBean>  createAvancesTruchos(Collection totales) {
      Collection<AvanceBean>  controlAvances = new ArrayList<AvanceBean>();
      AvanceBean avanceInicial = new AvanceBean();
      ControlAvanceInicialTotalBean total = new ControlAvanceInicialTotalBean();
      for (int i = 0; i < 50; i++) {
    	 avanceInicial = crearControlAvanceInicialTrucho(i);
         controlAvances.add(avanceInicial);
         total = crearControlAvanceInicialTotalTrucho(avanceInicial,total);
		}
      	totales.add(total);
	    return controlAvances;
   }
 /*
      for (int i = 0; i < 50; i++) {
         controlAvances.add(crearControlAvanceInicialTrucho(i));
      }
      return controlAvances;
   }
*/
   @SuppressWarnings("unchecked")
   private SortedBag crearEVAsTruchos() {
      // Fake data
      SortedBag evas = new TreeBag(new Comparator() {

         public int compare(Object o1, Object o2) {
            return ((EVABean) o1).compareTo((EVABean) o2);
         }
      });

      Calendar calendar = new GregorianCalendar();

      calendar.add(Calendar.DAY_OF_MONTH, -25);
      for (int i = 0; i < 25; i++) {
         evas.add(crearEVATrucho(i, (Calendar) calendar.clone()));
         calendar.add(Calendar.DAY_OF_MONTH, 1);
      }
      return evas;
   }

   private EVABean crearEVATrucho(int i, Calendar calendar) {
      EVABean eva = new EVABean();
      eva.setId(i);
      eva.setDescripcion("descripcion trucha " + i);
      eva.setFecha(calendar);
      eva.setEstimado(7 * i);
      eva.setIncurrido(3 * i);
      eva.setAvance(5 * i);
      return eva;
   }

   private ControlAvanceInicialTotalBean crearControlAvanceInicialTotalTrucho(AvanceBean avanceInicial,ControlAvanceInicialTotalBean total) {
	      ControlAvanceInicialTotalBean control = new ControlAvanceInicialTotalBean();
	      control.setAvance((total.getAvance()+ avanceInicial.getAvance()));
	      control.setCostoEstimado(total.getCostoEstimado() + avanceInicial.getCostoEstimado());
	      control.setCostoReal(total.getCostoReal() + avanceInicial.getCostoReal());
	      control.setEsfuerzoEstimativo(total.getEsfuerzoEstimativo() + avanceInicial.getEsfuerzoEstimativo());
	      control.setGanado(total.getGanado() + avanceInicial.getGanado());
	return control;
   }

   private AvanceBean crearControlAvanceInicialTrucho(int i) {
      AvanceBean control = new AvanceBean();
      control.setNumeral(String.valueOf(i + 1));
      control.setId(i);
      control.setActividad("actividad" + i);
      control.setCostoEstimado(new Float(2.5) * i);
      control.setEsfuerzoEstimativo(new Float(2.1) * i);
      control.setCostoReal(new Float(2.2) * i);
      control.setAvance((new Float(2) * i) + 1);
      control.setGanado(new Float(2.3 * i));
      return control;
   }


   private Collection<EstimacionBean> getEstimacionesTruchas() {
      Collection<EstimacionBean> estimaciones = new ArrayList<EstimacionBean>();
      for (int i = 0; i < 3; i++) {
         estimaciones.add(crearEstimacionTrucha(i));
      }
      return estimaciones;
   }


   private  Collection<IndiceBean> getIndicesTruchos() {
      Collection<IndiceBean> indices = new ArrayList<IndiceBean>();
      for (int i = 0; i < 3; i++) {
         indices.add(crearIndicesTruchos(i));
      }
      return indices;
   }


   private EstimacionBean crearEstimacionTrucha(int i) {
      EstimacionBean estimacion = new EstimacionBean();
      estimacion.setDescripcion("estimacion descripcion "+i);
      estimacion.setTipico(new Float(i));
      estimacion.setAtipico(new Float(i));
      return estimacion ;
   }


   private IndiceBean crearIndicesTruchos(int i) {
      IndiceBean indice = new IndiceBean();
      indice.setDescripcion("indice descripcion trucha " + i);
      SortedMap<String, Float> costos = new TreeMap<String, Float>();
      String sDate;
     /* for (int j = 0; j < 50; j++) {
         if(j==0) {
            sDate = Utils.stringDate();
         } else {
            sDate =new Integer(2008 - j)+"-04-21";
         }
         costos.put(sDate, new Float(j*7*i));
      }
      indice.setValores(costos);*/
      return indice;
   }

}

